package com.molihub.service;

import com.molihub.entity.Article;
import com.molihub.entity.ArticleCountStatistics;
import com.molihub.entity.ArticleDateArchive;

import java.util.Date;
import java.util.List;

/**
 * @ClassName: ArticleService
 * @Description: 文章操作业务层接口
 * @author: xw
 * @date 2020/1/26 21:05
 * @Version: 1.0
 **/
public interface ArticleService {

    /**
     * @return java.lang.Integer
     * @Description 发表文章
     * @Author xw
     * @Date 14:58 2020/1/20
     * @Param [article]
     **/
    public Integer publishArticle(Article article);


    /**
     * @return java.lang.Integer
     * @Description 通过文章ID删除文章
     * @Author xw
     * @Date 14:59 2020/1/20
     * @Param [articleId]
     **/
    public Integer deleteArticle(Integer articleId);

    /**
     * @return java.util.List<com.molihub.entity.Article>
     * @Description 查找文章
     * 返回文章的属性:[文章Id,作者Id,文章标题,发表时间,文章内容,是否为私密文章,阅读次数]
     * 通过作者ID,文章标题(模糊查找),文章类别(未处理的字符串类型),文章标签(未处理的字符串类型)查找,哪个属性不为空就按哪个查找哪个
     * 传入的对象要求[作者ID,文章标题(模糊查找),发表时间,文章类别(未处理的字符串类型),文章标签(未处理的字符串类型)]只有一个属性不为空
     * @Author xw
     * @Date 15:00 2020/1/20
     * @Param [article]
     **/
    public List<Article> searchArticles(Article article);

    /**
     * @return com.molihub.entity.Article
     * @Description 通过文章ID查找文章
     * 返回文章的属性:全部属性
     * @Author xw
     * @Date 15:05 2020/1/20
     * @Param [articleId]
     **/
    public Article getArticleById(Integer articleId);

    /**
     * @return java.util.List<com.molihub.entity.Article>
     * @Description 根据起止时间和用户Id获得用户这一时间段的所有文章
     * 返回文章的属性:[文章Id,作者Id,文章标题,发表时间,文章内容,是否为私密文章,阅读次数]
     * @Author xw
     * @Date 15:13 2020/1/20
     * @Param [userId, from, to]
     **/
    public List<Article> getArticlesByUserIdAndDate(Integer userId, Date from, Date to);

    /**
     * @return void
     * @Description 修改文章
     * 可修改的内容:[文章标题,文章内容,文章类别,文章标签,私密性]
     * @Author xw
     * @Date 15:15 2020/1/20
     * @Param [article]
     **/
    public Integer updateArticle(Article article);

    /**
     * @return com.molihub.entity.ArticleCountStatistics
     * @Description 统计用户的文章信息
     * @Author xw
     * @Date 16:33 2020/2/1
     * @Param [userId]
     **/
    public ArticleCountStatistics statistics(Integer userId);

    /**
     * @return java.util.List<com.molihub.entity.Article>
     * @Description 根据用户id获得文章
     * @Author xw
     * @Date 18:56 2020/2/1
     * @Param [userId]
     **/
    public List<Article> getArticlesByUserId(Integer userId);

    /**
     * 根据用户ID获取用户发布的全部内容
     *
     * @param userId 用户id
     * @return java.util.List<com.molihub.entity.Article>
     * @author GGBOY
     * @date 2020/3/1
     */
    public List<Article> getAllArticlesByUserId(Integer userId);

    /**
     * @return java.util.List<com.molihub.entity.Article>
     * @Description 根据标题模糊查找我的文章
     * @Author xw
     * @Date 18:50 2020/2/3
     * @Param [userId, title]
     **/
    public List<Article> getMyArticles(Integer userId, String title);

    /**
     * @return java.lang.Integer
     * @Description 获取文章的总赞数
     * @Author xw
     * @Date 19:20 2020/2/1
     * @Param [articleId]
     **/
    public Integer getLikeCountByArticle(Integer articleId);

    /**
     * @return java.lang.Integer
     * @Description 获取文章的总评论数
     * @Author xw
     * @Date 19:20 2020/2/1
     * @Param [articleId]
     **/
    public Integer getCommentCountByArticle(Integer articleId);

    /**
     * @return java.util.List<com.molihub.entity.Article>
     * @Description 根据用户id和文章状态获得文章
     * @Author xw
     * @Date 11:21 2020/2/2
     * @Param [userId, articleStatus]
     **/
    public List<Article> getArticlesByUserIdAndStatus(Integer userId, Integer articleStatus);

    /**
     * @return java.lang.Integer
     * @Description 根据用户id和类别获得文章数量
     * @Author xw
     * @Date 19:34 2020/2/2
     * @Param [userId, kind]
     **/
    public Integer getArticleCountByUserIdAndKind(Integer userId, String kind);

    /**
     * @return java.lang.Integer
     * @Description 根据用户id和标签获得文章数量
     * @Author xw
     * @Date 19:35 2020/2/2
     * @Param [userId, tag]
     **/
    public Integer getArticleCountByUserIdAndTag(Integer userId, String tag);

    /**
     * @return java.lang.Integer
     * @Description 删除分类目录
     * @Author xw
     * @Date 14:15 2020/2/3
     * @Param [kindName]
     **/
    public Integer deleteArticleKind(Integer userId, String kindName);

    /**
     * @return java.lang.Integer
     * @Description 删除标签
     * @Author xw
     * @Date 14:15 2020/2/3
     * @Param [kindName]
     **/
    public Integer deleteArticleTag(Integer userId, String tagName);

    /**
     * @return java.lang.Integer
     * @Description 重命名文章中涉及到的分类目录
     * @Author xw
     * @Date 16:54 2020/2/3
     * @Param [userId, newName, oldName]
     **/
    public Integer updateArticleKind(Integer userId, String newName, String oldName);

    /**
     * @return java.lang.Integer
     * @Description 重命名文章中涉及到的标签
     * @Author xw
     * @Date 16:55 2020/2/3
     * @Param [userId, newName, oldName]
     **/
    public Integer updateArticleTag(Integer userId, String newName, String oldName);

    /**
     * @return java.lang.Integer
     * @Description 添加阅读次数
     * @Author xw
     * @Date 20:46 2020/2/7
     * @Param [articleId]
     **/
    public Integer addReadCount(Integer articleId);

    /**
     * 获取最新的5篇文章
     *
     * @return java.util.List<com.molihub.entity.Article>
     * @author GGBOY
     * @date 2020/2/9
     */
    public List<Article> getNewestFiveArticle();

    /**
     * 获取最新的5篇短文本内容
     *
     * @return java.util.List<com.molihub.entity.Article>
     * @author GGBOY
     * @date 2020/2/13
     */
    public List<Article> getNewestFivePost();


    /**
     * 获得文章总数
     *
     * @return java.lang.Integer
     * @author GGBOY
     * @date 2020/2/10
     */
    public Integer getArticlesNumber();

    /**
     * @return java.util.List<com.molihub.entity.Article>
     * @Description 根据用户同类标签下的所有文章（根据阅读次数降序）
     * @Author xw
     * @Date 20:51 2020/2/14
     * @Param [id, tag, status, secret]
     **/
    public List<Article> getArticlesByUserAndTag(Integer id, String tag, Integer status, boolean secret, Integer aid);

    /**
     * @return java.util.List<com.molihub.entity.Article>
     * @Description 获取用户最受欢迎的文章
     * 要求：已公开发布。阅读量降序
     * @Author xw
     * @Date 14:43 2020/3/1
     * @Param [userId]
     **/
    public List<Article> getFamousArticles(int userId);

    /**
     * @return java.util.List<com.molihub.entity.ArticleDateArchive>
     * @Description 获得用户文章日期归档
     * @Author xw
     * @Date 17:07 2020/3/1
     * @Param [userId]
     **/
    public List<ArticleDateArchive> getArchive(Integer userId);
}
